/**
 * @file   : convertor.ts
 * @time   : 17:29
 * @date   : 2025/3/21
 * @mail   : 9727005@qq.com
 * @creator: ShanDong Xiedali
 * @company: Less is more.Simple is best!
 */

/**
 * 各种转换器（类型转换，进制转换等）
 */
export class Convertor {
    /**
     * 类型断言（假定你知道输入数据的类型，把IN类型当做为OUT类型使用；但inputData的类型没有改变，其依然是IN类型）
     * @template IN 输入数据的类型。
     * @template OUT 输出数据的类型。
     * @param {IN} inputData
     * @return {OUT} 转换后的数据
     */
    static asType<IN, OUT>(inputData: IN): OUT {
        return inputData as unknown as OUT;
    }

    /**
     * 类型转换（目前仅能转换简单类型，如string、number、boolean、Date等）
     * @template IN 输入数据的类型。
     * @template OUT 输出数据的类型。
     * @param {IN} inputData 输入数据
     * @param {OUT} defaultValue 默认值
     * @return {OUT} 转换后的数据
     */
    static changeType<IN, OUT>(inputData: IN, defaultValue: OUT): OUT {
        const inputType = typeof inputData;
        const outputType = typeof defaultValue;
        try {
            if (outputType === "string") {
                return String(inputData) as OUT;
            }

            if (outputType === "number") {
                return Number(inputData) as OUT;
            }

            if (outputType === "boolean") {
                return Boolean(inputData) as OUT;
            }

            //日期类型
            if (outputType === "object" && defaultValue instanceof Date) {
                if (inputType === "number") {
                    return new Date(inputData as number) as OUT;
                }

                const date = new Date(String(inputData));
                if (isNaN(date.getTime())) {
                    return defaultValue;
                }
                return date as OUT;
            }
        } catch (e) {
            return defaultValue;
        }

        return inputData as unknown as OUT;
    }

    /**
     * 数学中各种进制之间的相互转换,返回字符串表示的数据
     * @param {string} numberString  待转换的(字符串格式的)目标数字
     * @param {int} fromBase 从**进制转换
     * @param {int} toBase 转换到**进制
     * @return {string}
     */
    static convertBase(numberString: string, fromBase: number, toBase: number): string {
        if (fromBase === toBase) {
            return numberString;
        }

        const decimalNumber = parseInt(numberString, fromBase);
        return decimalNumber.toString(toBase);
    }
}
